package pl.un4giv3n.mightvsmagic.action.clan;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import pl.un4giv3n.mightvsmagic.entity.Message;
import pl.un4giv3n.mightvsmagic.entity.User;
import pl.un4giv3n.mightvsmagic.entity.UserType;
import pl.un4giv3n.mightvsmagic.utils.ClanUtil;

public class ApproveClanUserAction extends ClanAction {

	private static final long serialVersionUID = 1L;
	private boolean approve;
	private Long userId;

	@Override
	public String execute() {
		EntityManager entityManager = getEntityManager();
		user = getSessionUser(entityManager);
		if (user == null) {
			addActionError("Zaloguj się");
			entityManager.close();
			return LOGIN;
		}
		clan = user.getClan();
		if (clan == null || !isCanConfigClan()) {
			entityManager.close();
			addActionError("Wybrany klan nie istnieje lub niewystarczające uprawnienia.");
			return INPUT;
		} else if (userId == null) {
			entityManager.close();
			addActionError("Wybrany użytkownik nie istnieje");
			return INPUT;
		} else {
			User pendingUser = entityManager.find(User.class, userId);
			if (pendingUser != null
					&& pendingUser.isClanAcceptancePending()
					&& pendingUser.getClan() != null
					&& pendingUser.getClan().getId().longValue() == clan
							.getId().longValue()) {
				EntityTransaction transaction = entityManager.getTransaction();
				transaction.begin();
				if(approve){
					if(ClanUtil.canJoinClan(clan, pendingUser)){
						pendingUser.setClan(clan);
						pendingUser.setClanAcceptancePending(false);
						clan.addUser(pendingUser);
						entityManager.merge(clan);
						sendApprovementMessage(pendingUser, entityManager);
					}else{
						transaction.rollback();
						entityManager.close();
						addActionError("W klanie nie ma miejsca dla kolejnego " + (pendingUser.getUserType() == UserType.KNIGHT ? "rycerza." : "maga."));
						return INPUT;
					}
				}else{
					pendingUser.setClanAcceptancePending(false);
					pendingUser.setClan(null);
					sendDeclinedMessage(pendingUser, entityManager);
				}
				entityManager.merge(pendingUser);
				entityManager.flush();
				transaction.commit();
			}else{
				entityManager.close();
				addActionError("Użytkownik nie istnieje bądź nie oczekuje na przyjęcie do tego klanu.");
				return INPUT;
			}
		}
		entityManager.close();
		return SUCCESS;
	}

	private void sendApprovementMessage(User pendingUser,
			EntityManager entityManager) {
		Message msg = new Message("Przyjęcie do klanu", "Twoje podanie do klanu " +clan.getName() + " zostało zaakceptowane.", user, pendingUser);
		entityManager.persist(msg);
	}

	private void sendDeclinedMessage(User pendingUser, EntityManager entityManager) {
		Message msg = new Message("Odmowa przyjęcia do klanu", "Twoje podanie do klanu " +clan.getName() + " zostało odrzucone", user, pendingUser);
		entityManager.persist(msg);
	}

	public boolean isApprove() {
		return approve;
	}

	public void setApprove(boolean approve) {
		this.approve = approve;
	}

	public Long getUserId() {
		return userId;
	}

	public void setUserId(Long userId) {
		this.userId = userId;
	}

}
